package com.alibaba.shopping_cart_service.service;

import com.alibaba.shopping_common.pojo.CartGoods;
import com.alibaba.shopping_common.service.CartService;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.BoundHashOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * @ClassName CartServiceImpl
 * @Description 购物车服务
 * @Author Leo
 * @Date 2024/12/18 08:56
 */
@Service
@DubboService
public class CartServiceImpl implements CartService {

    @Autowired
    private RedisTemplate redisTemplate;

    @Override
    public void addCart(Long userId, CartGoods cartGoods) {
        System.out.println(cartGoods);
        // 根据ID查询购物车的商品列表
        List<CartGoods> cartList = findCartList(userId);
        if (!cartList.isEmpty()){
            for (CartGoods goods : cartList) {
                // 商品列表中已经存在本次要添加的商品，直接更新件数
                if (goods.getGoodId().equals(cartGoods.getGoodId())){
                    // goods.getNum()：用户购物车中的商品件数
                    // cartGoods.getNum()：用户新增加的商品件数
                    Integer num = goods.getNum()+cartGoods.getNum();
                    // 更新商品件数
                    goods.setNum(num);
                    redisTemplate.boundHashOps("cartList").put(userId,cartList);
                    return;
                }
            }
        }
        // 如果购物车列表为空，证明没有任何商品数据，直接添加即可
        cartList.add(cartGoods);
        redisTemplate.boundHashOps("cartList").put(userId,cartList);
    }

    /**
     * 修改用户购物车数据
     * @param userId
     * @param goodsId
     * @param num
     */
    @Override
    public void handlerCart(Long userId, Long goodsId, Integer num) {
        // 从Redis中获取购物车列表
        List<CartGoods> cartList = findCartList(userId);
        // 遍历购物车列表
        for (CartGoods cartGoods : cartList) {
            // 找到要被更新的商品
            if (cartGoods.getGoodId().equals(goodsId)){
                cartGoods.setNum(num);
                break;
            }
        }
        // 将新的购物车商品数据写入Redis中
        redisTemplate.boundHashOps("cartList").put(userId,cartList);
    }

    /**
     * 删除购物车中的商品数据
     * @param userId
     * @param goodsId
     */
    @Override
    public void deleteCartOption(Long userId, Long goodsId) {
        // 从Redis中获取商品数据
        List<CartGoods> cartList = findCartList(userId);
        // 找到需要更新的商品
        for (CartGoods cartGoods : cartList) {
            if (goodsId.equals(cartGoods.getGoodId())){
                // 移除商品数据
                cartList.remove(cartGoods);
                break;
            }
        }
        // 将新的数据写入Redis中
        redisTemplate.boundHashOps("cartList").put(userId,cartList);
    }

    /**
     * 查询用户购物车的商品数据
     * @param userId
     * @return
     */
    @Override
    public List<CartGoods> findCartList(Long userId) {
        // 根据用户ID从Redis查询购物车的商品列表
        Object cartList = redisTemplate.boundHashOps("cartList").get(userId);
        // 如果查询的结果为空，直接返回一个空列表
        if (cartList == null){
            return new ArrayList<CartGoods>();
        }else {
            // 如果查询的结果不为空，直接返回一个购物车的商品列表
            return (List<CartGoods>) cartList;
        }
    }

    /**
     * 同步修改Redis中的数据
     * @param cartGoods
     */
    @Override
    public void refreshRedisCartGoods(CartGoods cartGoods) {
        // 获取Redis中的所有用户的购物车数据
        BoundHashOperations cartList = redisTemplate.boundHashOps("cartList");
        Map<Long,List<CartGoods>> allCartGoods = cartList.entries();
        Collection<List<CartGoods>> values = allCartGoods.values();

        // 遍历所有用户的购物车数据
        for (List<CartGoods> goodsList : values) {
            for (CartGoods goods:goodsList){
                // 被修改的商品
                if (cartGoods.getGoodId().equals(goods.getGoodId())){
                    // 更新Redis中商品数据
                    goods.setGoodsName(cartGoods.getGoodsName());
                    goods.setPrice(cartGoods.getPrice());
                    goods.setHeaderPic(cartGoods.getHeaderPic());
                }
            }
        }
        // 删除Redis中之前所有用户的购物车数据
        redisTemplate.delete("cartList");
        // 向Redis中重新写入所有用户的购物车数据
        redisTemplate.boundHashOps("cartList").putAll(allCartGoods);
    }

    @Override
    public void deleteRedisCartGoods(Long goodsId) {
        // 获取Redis中的所有用户的购物车数据
        BoundHashOperations cartList = redisTemplate.boundHashOps("cartList");
        Map<Long,List<CartGoods>> allCartGoods = cartList.entries();
        Collection<List<CartGoods>> values = allCartGoods.values();

        // 遍历所有用户的购物车数据
        for (List<CartGoods> goodsList : values) {
            // 遍历每个用户的购物车列表
            for (CartGoods goods:goodsList){
                // 被修改的商品
                if (goodsId.equals(goods.getGoodId())){
                    goodsList.remove(goods);
                    break;
                }
            }
        }
        // 删除Redis中之前所有用户的购物车数据
        redisTemplate.delete("cartList");
        // 向Redis中重新写入所有用户的购物车数据
        redisTemplate.boundHashOps("cartList").putAll(allCartGoods);
    }
}




